package org.javahispano.javacup.tacticas_aceptadas.psubias.ar.com.psubias.laLegion;

import java.util.Random;

import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;

public class LaLegionLib {
	
	protected double anguloPase(int indice, SituacionPartido sp, double distancia, double fuerza) {

    	double angulo = 0;
    	double anguloReal = 30;
    	double altura = 0;
    	double recorrido = 0;
    	double balonDz = 0;
    	double vel = 0;

    	while (anguloReal >=10) {

    		angulo = anguloReal * Math.PI / 180d;
    		vel = fuerza * Constantes.getVelocidadRemate(sp.detalleMisJugadores()[indice].getRemate()) * Math.cos(angulo);
        	altura = 0;
        	recorrido = 0;
        	balonDz = redondeaMultiplo(vel * Math.sin(angulo), Constantes.G);

			altura = altura + balonDz;
		    balonDz = redondeaMultiplo(balonDz - Constantes.G, Constantes.G);
		    vel = vel * Constantes.FACTOR_DISMINUCION_VEL_BALON_AIRE;;
		    recorrido = recorrido + vel;

		    while (distancia > recorrido && altura >= 0) {
				altura = altura + balonDz;
				balonDz = redondeaMultiplo(balonDz - Constantes.G, Constantes.G);
			    vel = vel * Constantes.FACTOR_DISMINUCION_VEL_BALON_AIRE;
			    recorrido = recorrido + vel;
    		}
	    	if ((altura > 1.8) && (altura < 3)) {
	    		return anguloReal;
	    	} else {
	    		anguloReal = anguloReal - 0.1;
	    		altura = 0;
	    		angulo = 0;
	    		recorrido = 0;
	    	}
		}

    	return 45;
	}
    
    protected double distanciaRival(SituacionPartido sp, Posicion pos) {
    	double dist = 200;
    	
    	for (int i = 0; i < 11; i++) {
			if (sp.balon().distancia(sp.rivales()[i])<dist) {
				dist = sp.balon().distancia(sp.rivales()[i]);
			}
		}    	
    	return dist;
    }
    
    protected double distanciaRival(SituacionPartido sp) {
    	return distanciaRival(sp, sp.balon());
    }

    protected int destinoPase(int indice, SituacionPartido sp, Zona noPase){
    	boolean libres[] = new boolean[]{false,false,false,false,false,false,false,false,false,false,false}; 
    	
    	double y = sp.misJugadores()[indice].getY()-2;

    	for (int i = 1; i <= 10; i++) {
    		if ((y!=i) && (sp.misJugadores()[i].getY() > y) && 
    				(sp.balon().distancia(sp.misJugadores()[i]) < 50) && 
    				(sp.balon().distancia(sp.misJugadores()[i]) > 10) && 
    				(!noPase.dentroDelArea(sp.misJugadores()[i]))){
    			libres[i] = true;
    		}
    	}
    	
    	double distancia = 0;
    	int paseA = 12; 
    	double distancia2 = 0;
    	int paseA2 = 12; 
    	for (int i = 1; i <= 10; i++) {
    		if (libres[i]) {
    			if (sp.balon().distancia(sp.misJugadores()[i]) > distancia) {
    				distancia2 = distancia;
    				paseA2 = paseA;
    				distancia = sp.balon().distancia(sp.misJugadores()[i]);
    				paseA = i;
    			} else if (sp.balon().distancia(sp.misJugadores()[i]) > distancia2){
    				distancia2 = sp.balon().distancia(sp.misJugadores()[i]);
    				paseA2 = i;
    			}
    		}
    	}
    	
    	if (paseA2 != 12 && sp.balon().getY() < -10) {
    		if (sp.balon().getX() < 0) {
    			if (sp.misJugadores()[paseA].getX() < sp.misJugadores()[paseA2].getX()) {
    				return paseA;
    			} else {
    				return paseA2;
    			}
    		} else {
    			if (sp.misJugadores()[paseA].getX() > sp.misJugadores()[paseA2].getX()) {
    				return paseA;
    			} else {
    				return paseA2;
    			}
    		}
    	}
	    else {
	    	double r = new Random().nextDouble();
	    	
	    	if (r < (distancia / (distancia + distancia2))) {
	    		return paseA2;
	    	}
	
	    	return paseA;
	    }
    }

    protected double rivalMasCercano(Posicion pos, SituacionPartido sp) {
		
		double distancia = 150;
		
		for (int i = 0; i < 11; i++) {
			if (sp.rivales()[i].distancia(pos) < distancia) {
				distancia = sp.rivales()[i].distancia(pos);
			}
		}
		return distancia;
	}    
	
    protected boolean puedeRematar(int indice, SituacionPartido sp){
    	
    	int pueden[] = sp.puedenRematar();
    	for (int i = 0; i < pueden.length; i++) {
    		if (pueden[i] == indice) {
    			return true;
    		}
    	}
    	return false;
    }


    protected double fuerzaPase(SituacionPartido sp, Posicion hasta) {
    	
    	if (sp.balon().distancia(hasta) / 42 > 1) {
    		return 1;
    	}
    	return sp.balon().distancia(hasta) / 42;
    }

    private double redondeaMultiplo(double valor, double divisor) {
        return Math.round(valor / divisor) * divisor;
    }
}
